package cn.org.guhao.practice.redis.redpacket.dao;

import info.boruisi.platform.redis.template.BigDecimalRedisTemplate;
import info.boruisi.platform.redis.template.IntegerRedisTemplate;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;
import java.util.concurrent.TimeUnit;

@Repository
public class RedPacketDao {

    private static final TimeUnit SECONDS = TimeUnit.SECONDS;
    private static final long DEFAULT_TIMEOUT = 5;

    private final RedisTemplate<String, Date> redisTemplate;
    private final BigDecimalRedisTemplate bigDecimalRedisTemplate;
    private final IntegerRedisTemplate integerRedisTemplate;

    public RedPacketDao(RedisTemplate<String, Date> redisTemplate, BigDecimalRedisTemplate bigDecimalRedisTemplate, IntegerRedisTemplate integerRedisTemplate) {
        this.redisTemplate = redisTemplate;
        this.bigDecimalRedisTemplate = bigDecimalRedisTemplate;
        this.integerRedisTemplate = integerRedisTemplate;
    }

    /**
     * 获取锁（利用 SETNX 命令）
     * @param key
     * @return
     */
    public boolean getLock(String key){
        Date now = new Date();
        return redisTemplate.opsForValue().setIfAbsent(key,now, DEFAULT_TIMEOUT,SECONDS);
    }

    public void unLock(String key){
        redisTemplate.delete(key);
    }

    /**
     * 获取指定 key 的值
     *
     * @param key
     * @return
     */
    public BigDecimal getBigDecimal(String key) {
        return bigDecimalRedisTemplate.opsForValue().get(key);
    }

    /**
     * 设置指定 key 的值
     *
     * @param key
     * @param value
     */
    public void setBigDecimal(String key, BigDecimal value) {
        bigDecimalRedisTemplate.opsForValue().set(key, value);
    }

    /**
     * 获取指定 key 的值
     *
     * @param key
     * @return
     */
    public Integer getInteger(String key) {
        return integerRedisTemplate.opsForValue().get(key);
    }

    /**
     * 设置指定 key 的值
     *
     * @param key
     * @param value
     */
    public void seInteger(String key, Integer value) {
        integerRedisTemplate.opsForValue().set(key, value);
    }

    /**
     * leftPushAll
     * @param key
     * @param values
     */
    public void leftPushAll(String key, Collection<Integer> values){
        integerRedisTemplate.opsForList().leftPushAll(key,values);
    }

    public Integer leftPop(String key){
        return integerRedisTemplate.opsForList().leftPop(key);
    }

    public Long listSize(String key){
        return integerRedisTemplate.opsForList().size(key);
    }

}
